#include "VentanaInstructor.h"
#include <iostream>

VentanaInstructor::VentanaInstructor(Instructor *instructor) {
	this->instructor = instructor;
	this->set_title("Screencast Educacional (Instructor)");
	this->set_default_size(350, 700);

	generarMenu();
	Gtk::Widget* pMenu = pUiManager->get_widget("/Menu");

	this->cajaChat = this->instructor->getCajaChat();
	this->cajaChat->pack_start(*pMenu, Gtk::PACK_SHRINK);

	this->add(*(this->cajaChat));
	this->show_all();
}

void VentanaInstructor::generarMenu() {
	this->pGrupo = Gtk::ActionGroup::create();
	this->pUiManager = Gtk::UIManager::create();

	this->pGrupo->add(Gtk::Action::create("MenuArchivo", "_Archivo"));
	this->pGrupo->add(Gtk::Action::create("AdjArch", "_Adjuntar Archivo"),
			sigc::mem_fun(*this, &VentanaInstructor::adjuntar));
	this->pGrupo->add(Gtk::Action::create("Salir", "_Salir"),
			sigc::mem_fun(*this, &VentanaInstructor::salir));
	this->pGrupo->add(Gtk::Action::create("MenuCuenta", "_Cuenta"));
	this->pGrupo->add(Gtk::Action::create("Login", "_Login"),
			sigc::mem_fun(*this, &VentanaInstructor::login));
	this->pGrupo->add(Gtk::Action::create("Logout", "_Logout"),
			sigc::mem_fun(*this, &VentanaInstructor::logout));
	this->pGrupo->add(Gtk::Action::create("MenuCursos", "_Cursos"));
	this->pGrupo->add(Gtk::Action::create("CrearCurso", "_Crear Curso"),
			sigc::mem_fun(*this, &VentanaInstructor::crearCurso));
	this->pGrupo->add(Gtk::Action::create("MenuClases", "_Clases"));
	this->pGrupo->add(Gtk::Action::create("CrearClase", "_Crear Clase"),
			sigc::mem_fun(*this, &VentanaInstructor::crearClase));
	this->pGrupo->add(Gtk::Action::create("IniciarClase", "_Iniciar Clase"),
			sigc::mem_fun(*this, &VentanaInstructor::iniciarClase));
	this->pGrupo->add(Gtk::Action::create("FinalizarClase", "_Finalizar Clase"),
				sigc::mem_fun(*this, &VentanaInstructor::finalizarClase));
	this->pGrupo->add(Gtk::Action::create("AnadirClase", "_Añadir Clase"),
				sigc::mem_fun(*this, &VentanaInstructor::anadir_Clase));
	this->pGrupo->add(Gtk::Action::create("IniciarClasedeCurso", "_Iniciar Clase"),
				sigc::mem_fun(*this, &VentanaInstructor::iniciarClaseDeCurso));
	this->pGrupo->add(Gtk::Action::create("PausarClase", "_Pausar Clase"),
				sigc::mem_fun(*this, &VentanaInstructor::pausarClase));
	this->pGrupo->add(Gtk::Action::create("ContinuarClase", "_Continuar Clase"),
				sigc::mem_fun(*this, &VentanaInstructor::continuarClase));

	this->pUiManager->insert_action_group(pGrupo);

	Glib::ustring ui_info = "<ui>"
			"  	<menubar name='Menu'>"
			"	<menu action='MenuArchivo'>"
			"      	<menuitem action='AdjArch'/>"
			"      	<separator/>"
			"      	<menuitem action='Salir'/>"
			"   </menu>"
			"   <menu action='MenuCuenta'>"
			"      	<menuitem action='Login'/>"
			"      	<menuitem action='Logout'/>"
			"	</menu>"
			"	<menu action='MenuCursos'>"
			"      	<menuitem action='CrearCurso'/>"
			"      	<menuitem action='AnadirClase'/>"
			"      	<menuitem action='IniciarClasedeCurso'/>"
			"	</menu>"
			"	<menu action='MenuClases'>"
			"      	<menuitem action='CrearClase'/>"
			"	<menuitem action='IniciarClase'/>"
			"	<menuitem action='ContinuarClase'/>"
			"	<menuitem action='PausarClase'/>"
			"	<menuitem action='FinalizarClase'/>"
			"	</menu>"
			"  	</menubar>"
			"</ui>";

	pUiManager->add_ui_from_string(ui_info);
	this->anularBotones1(false);
	this->anularBotones2(false);
}

//***************************FUNCIONES DEL MENU********************************
void VentanaInstructor::adjuntar() {
	Gtk::FileChooserDialog dialAdj("Seleccione el archivo",
			Gtk::FILE_CHOOSER_ACTION_OPEN);
	dialAdj.set_transient_for(*this);
	dialAdj.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
	dialAdj.add_button("Adjuntar a clase", ADJUNTAR_A_CLASE);
	dialAdj.add_button("Adjuntar a curso", ADJUNTAR_A_CURSO);
	int clicked = dialAdj.run();
	if (clicked == ADJUNTAR_A_CLASE) {
		DialogoCodigoClase dialCod;
		dialCod.set_transient_for(*this);
		clicked = dialCod.run();
		if(clicked == Gtk::RESPONSE_OK) {
			int ret = instructor->adjuntar(dialAdj.get_filename(), dialCod.getCodigo(), "0");
			if(ret == 1)
				this->crearDialogo("No existe la clase o ya ha iniciado");
		}
	}
	if (clicked == ADJUNTAR_A_CURSO) {
		DialogoCodigoCurso dialCod;
		dialCod.set_transient_for(*this);
		clicked = dialCod.run();
		if(clicked == Gtk::RESPONSE_OK) {
			int ret =  instructor->adjuntar(dialAdj.get_filename(),
					dialCod.getCodigoClase(), dialCod.getCodigoCurso());
			if(ret == 1)
				this->crearDialogo("No existe el curso o la clase o ya ha iniciado");
		}
	}

}

void VentanaInstructor::salir() {
	Gtk::MessageDialog dialogo(*this, "Salir", false, Gtk::MESSAGE_QUESTION,
			Gtk::BUTTONS_OK_CANCEL);
	dialogo.set_secondary_text("¿Seguro que quiere salir?");
	int clicked = dialogo.run();
	if (clicked == Gtk::RESPONSE_OK) {
		Gtk::Main::quit();
	}
}

void VentanaInstructor::login() {
	DialogoLogin dialLogin;
	unsigned int ret = 1;
	dialLogin.set_transient_for(*this);
	int clicked = dialLogin.run();
	if (clicked == Gtk::RESPONSE_OK)
		ret = instructor->login(dialLogin.getUsuario(), dialLogin.getClave(), '0');
	switch(ret) {
	case(0) : {
		this->anularBotones1(true);
		this->anularLogin(false);
		break;
	}
	case(-2): {
		this->crearDialogo("Campos vacios");
		break;
	}
	case(-3): {
		this->crearDialogo("Error de conectividad");
		break;
	}
	case(-4): {
		this->crearDialogo("Usuario/Clave erronea");
		break;
	}
	}
}

void VentanaInstructor::logout() {
	instructor->logout();
	instructor->desconectar();
	this->anularLogin(true);
	this->anularBotones1(false);
	this->anularBotones2(false);
	this->crearDialogo("Sesion finalizada");
}

void VentanaInstructor::crearCurso() {
	DialogoCrearCurso dialCrearCurso;
	unsigned int ret = 1;
	dialCrearCurso.set_transient_for(*this);
	int clicked = dialCrearCurso.run();
	if (clicked == Gtk::RESPONSE_OK) {
		ret = instructor->crearCurso(dialCrearCurso.getCodigo(), dialCrearCurso.getDescripcion(), "Marzo");
		switch(ret) {
		case(0) : {
			//Aca poner un dialogo q diga Curso creado con exito y que le muestra el codigo descripcion y periodo
			this->crearDialogo("Curso creado con exito");
			break;
		}
		case(-1): {
			this->crearDialogo("Error de conectividad");
			break;
		}
		case(-2): {
			this->crearDialogo("Codigo invalido, por favor ingrese solo numeros");
			// Aca poner un dialogo que diga Codigo invalido, por favor ingrese solo letras
			break;
		}
		case(-3): {
			this->crearDialogo("El codigo y la descripcion es un campo necesario");
			// Aca poner un dialogo que diga El codigo y la descripcion son campos necesarios
			break;
		}
		case(-4): {
			this->crearDialogo("En el codigo ingrese solo numeros y sin ceros adelante");
			// Aca poner un dialogo que diga En el codigo ingrese solo numeros
			break;
		}
		case(-5): {
			this->crearDialogo("Curso ya creado por usted");
			break;
		}
		case(-6): {
			this->crearDialogo("Curso ya creado por otro instructor, ingrese otro código");
			break;
		}
		}
	}
}

void VentanaInstructor::anadir_Clase() {
	int ret = 1;
	DialogoAnadirClase dialAnadirClase;
	dialAnadirClase.set_transient_for(*this);
	int clicked = dialAnadirClase.run();
	if (clicked == Gtk::RESPONSE_OK) {
		ret = instructor->anadirClase(dialAnadirClase.getCodCurso(), dialAnadirClase.getCodClase(),
				dialAnadirClase.getDescripcion(), dialAnadirClase.getClave(), dialAnadirClase.disponible());
		switch(ret) {
		case(0) : {
			//Aca poner un dialogo q diga Curso creado con exito y que le muestra el codigo descripcion y periodo
			this->crearDialogo("Clase añadida con exito");
			break;
		}
		case(-1): {
			this->crearDialogo("Error de conectividad");
			break;
		}
		case(-2): {
			this->crearDialogo("Codigo invalido, por favor ingrese solo números");
			// Aca poner un dialogo que diga Codigo invalido, por favor ingrese solo letras
			break;
		}
		case(-3): {
			this->crearDialogo("Los códigos  y la descripcion son campos necesarios");
			// Aca poner un dialogo que diga El codigo y la descripcion son campos necesarios
			break;
		}
		case(-4): {
			this->crearDialogo("En el codigo ingrese solo numeros y sin ceros adelante");
			// Aca poner un dialogo que diga En el codigo ingrese solo numeros
			break;
		}
		case(-5): {
			this->crearDialogo("Curso no creado por usted");
			break;
		}
		case(-6): {
			this->crearDialogo("Clase del curso ya creada");
			break;
		}
		case(-7): {
			this->crearDialogo("Curso ya empezado no se pueden añadir mas clases");
			break;
		}
		}
	}
}

void VentanaInstructor::iniciarClaseDeCurso() {
	int ret = 1;
	DialogoIniciarClaseDeCurso dialIniciarClaseDeCurso;
	dialIniciarClaseDeCurso.set_transient_for(*this);
	int clicked = dialIniciarClaseDeCurso.run();
	if (clicked == Gtk::RESPONSE_OK)
		ret = instructor->iniciarClase(dialIniciarClaseDeCurso.getCodCurso(), dialIniciarClaseDeCurso.getCodClase());
	switch(ret) {
	case(0): {
		this->anularBotones1(false);
		this->anularBotones2(true);
		this->crearDialogo("Clase iniciada");
		break;
	}
	case(-1): {
		this->crearDialogo("Error de conectividad");
		break;
	}
	case(-2): {
		this->crearDialogo("Los códigos son campos necesarios");
		break;
	}
	case(-3): {
		this->crearDialogo("Codigo invalido, por favor ingrese solo números");
		break;
	}
	case(-4): {
		this->crearDialogo("En el codigo ingrese solo numeros y sin ceros adelante");
		break;
	}
	case(-5): {
		this->crearDialogo("Curso no creada por usted");
		break;
	}
	case(-6): {
		this->crearDialogo("Clase no creada en el curso");
		break;
	}
	case(-7): {
		this->crearDialogo("Clase ya terminada");
		break;
	}
	}
}

void VentanaInstructor::crearClase() {
	int ret = 1;
	DialogoCrearClase dialCrear;
	dialCrear.set_transient_for(*this);
	int clicked = dialCrear.run();
	if (clicked == Gtk::RESPONSE_OK)
		ret = instructor->crearClase(dialCrear.getCodigo(), dialCrear.getDescripcion(),
				dialCrear.getClave(), dialCrear.disponible());
	switch(ret) {
	case(0): {
		this->crearDialogo("Clase creada con exito");
		break;
	}
	case(-1): {
		this->crearDialogo("Error de conectividad");
		break;
	}
	case(-2): {
		this->crearDialogo("Clase ya creada por otro instructor, ingrese otro código");
		break;
	}
	case(-3): {
		this->crearDialogo("El codigo y la descripcion es un campo necesario");
		break;
	}
	case(-4): {
		this->crearDialogo("Codigo invalido, por favor ingrese solo numeros");
		break;
	}
	case(-5): {
		this->crearDialogo("En el codigo ingrese solo numeros y sin ceros adelante");
		break;
	}
	case(-6): {
		this->crearDialogo("Clase ya creada por usted");
		break;
	}
	}
}

void VentanaInstructor::iniciarClase() {
	int ret = 1;
	DialogoIniciarClase dialIniciar;
	dialIniciar.set_transient_for(*this);
	int clicked = dialIniciar.run();
	if (clicked == Gtk::RESPONSE_OK)
		ret = this->instructor->iniciarClase("", dialIniciar.getCodigo());
	switch(ret) {
	case(0): {
		this->anularBotones1(false);
		this->anularBotones2(true);
		this->crearDialogo("Clase iniciada");
		break;
	}
	case(-1): {
		this->crearDialogo("Error de conectividad");
		break;
	}
	case(-2): {
		this->crearDialogo("Los códigos son campos necesarios");
		break;
	}
	case(-3): {
		this->crearDialogo("Codigo invalido, por favor ingrese solo números");
		break;
	}
	case(-4): {
		this->crearDialogo("En el codigo ingrese solo numeros y sin ceros adelante");
		break;
	}
	case(-5): {
		this->crearDialogo("Clase no creada por usted");
		break;
	}
	case(-7): {
		this->crearDialogo("Clase ya terminada");
		break;
	}
	}

}

void VentanaInstructor::pausarClase() {
	instructor->pausarClase();
}

void VentanaInstructor::continuarClase() {
	instructor->continuarClase();
}

void VentanaInstructor::finalizarClase() {
	if(instructor->terminarClase() == 0) {
		this->anularBotones1(true);
		this->anularBotones2(false);
		this->crearDialogo("Clase terminada");
	}
}

void VentanaInstructor::anularLogin(bool logeado) {
	this->pGrupo->get_action("Login")->set_sensitive(logeado);
}

void VentanaInstructor::anularBotones1(bool transmitiendo) {
	this->pGrupo->get_action("Logout")->set_sensitive(transmitiendo);
	this->pGrupo->get_action("CrearCurso")->set_sensitive(transmitiendo);
	this->pGrupo->get_action("AnadirClase")->set_sensitive(transmitiendo);
	this->pGrupo->get_action("IniciarClasedeCurso")->set_sensitive(transmitiendo);
	this->pGrupo->get_action("CrearClase")->set_sensitive(transmitiendo);
	this->pGrupo->get_action("IniciarClase")->set_sensitive(transmitiendo);
	this->pGrupo->get_action("AdjArch")->set_sensitive(transmitiendo);
}

void VentanaInstructor::anularBotones2(bool transmitiendo) {
	this->pGrupo->get_action("ContinuarClase")->set_sensitive(transmitiendo);
	this->pGrupo->get_action("PausarClase")->set_sensitive(transmitiendo);
	this->pGrupo->get_action("FinalizarClase")->set_sensitive(transmitiendo);
}

void VentanaInstructor::crearDialogo(std::string comentario) {
	Gtk::MessageDialog dial_info(*this, comentario);
	dial_info.run();
}

//***************************************************************************

VentanaInstructor::~VentanaInstructor() {}
